package com.common.utils;

import java.sql.Clob;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * 系统工具类
 * @author lijinfeng
 * @date 2014-07-31
 * @version 2.0
 * @description 用于常用系统工具定义
 */
public final class ServiceUtils {
	
	private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args){
		//System.out.println(hangeToBig(35.20d));
		System.out.println(getTimeStamp());
	}
	/**
	 * 获取当前年份
	 * @return
	 */
	public static int getCurrentYear(){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		return calendar.get(Calendar.YEAR);
	}
	/**
	 * 获取当前月份
	 * @return
	 */
	public static int getCurrentMonth(){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		return calendar.get(Calendar.MONTH)+1;
	}
	/**
	 * 获取当前日期
	 * @return
	 */
	public static int getCurrentDay(){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		return calendar.get(Calendar.DAY_OF_MONTH);
	}
	/**
	 * 获取当前年月
	 * @return
	 */
	public static String getTimeStamp(){
		return df.format(new Date());
	}
	/**
	 * 获取当前年月
	 * @return
	 */
	public static String getCurrentTime(){
		df = new SimpleDateFormat("yyyy年MM月dd日");
		return df.format(new Date());
	}
	/**
     * 人民币转成大写
     * @param value
     * @return String
     */
    public static String hangeToBig(double value){
        char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示
        char[] vunit = { '万', '亿' }; // 段名表示
        char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示
        long midVal = (long) (value * 100); // 转化成整形
        String valStr = String.valueOf(midVal); // 转化成字符串
        String head = valStr.substring(0, valStr.length() - 2); // 取整数部分
        String rail = valStr.substring(valStr.length() - 2); // 取小数部分
        String prefix = ""; // 整数部分转化的结果
        String suffix = ""; // 小数部分转化的结果
        // 处理小数点后面的数
        if (rail.equals("00"))
        { // 如果小数部分为0
            suffix = "整";
        }
        else
        {
            suffix = digit[rail.charAt(0) - '0'] + "角" + digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来
        }
        // 处理小数点前面的数
        char[] chDig = head.toCharArray(); // 把整数部分转化成字符数组
        char zero = '0'; // 标志'0'表示出现过0
        byte zeroSerNum = 0; // 连续出现0的次数
        for (int i = 0; i < chDig.length; i++)
        { // 循环处理每个数字
            int idx = (chDig.length - i - 1) % 4; // 取段内位置
            int vidx = (chDig.length - i - 1) / 4; // 取段位置
            if (chDig[i] == '0')
            { // 如果当前字符是0
                zeroSerNum++; // 连续0次数递增
                if (zero == '0')
                { // 标志
                    zero = digit[0];
                }
                else if (idx == 0 && vidx > 0 && zeroSerNum < 4)
                {
                    prefix += vunit[vidx - 1];
                    zero = '0';
                }
                continue;
            }
            zeroSerNum = 0; // 连续0次数清零
            if (zero != '0')
            { // 如果标志不为0,则加上,例如万,亿什么的
                prefix += zero;
                zero = '0';
            }
            prefix += digit[chDig[i] - '0']; // 转化该数字表示
            if (idx > 0)
                prefix += hunit[idx - 1];
            if (idx == 0 && vidx > 0)
            {
                prefix += vunit[vidx - 1]; // 段结束位置应该加上段名如万,亿
            }
        }
        if (prefix.length() > 0)
            prefix += '圆'; // 如果整数部分存在,则有圆的字样
        return prefix + suffix; // 返回正确表示
    }
    /**
     * 分析条件
     * @param condition
     * @return
     * @throws Exception 
     */
    public static Map<String,Object> parseCondition(String condition) throws Exception{
		Map<String,Object> map = new HashMap<String,Object>();
		StringBuffer conditionStr = new StringBuffer(condition.substring(2, condition.length()-1));
		//定义正则表达式，解析运算符，以及运算符两侧
		String regex = "[!<>=]=*";
		//目前只识别仅有一个运算符的情况
		String[] complex = conditionStr.toString().split(regex);
		//key
		String key = complex[0];
		//value
		String value = complex[1];
		//operator
		String operator = "";
		//遍历 寻找出表达式
		Pattern p = Pattern.compile(regex);
		//遍历器
		Matcher m = p.matcher(conditionStr); 
		if(m.find()){
			operator = m.group();
		}
		map.put(key,setValue(operator,value));
		//返回值
		return map;
	}
    /**
	 * @description 获取taskservice的complete方法中的map对应的value
	 * @param operator
	 * @param value
	 * @return
     * @throws Exception 
	 */
	public static Object setValue(String operator,Object value) throws Exception{
		Object returnValue = new Object();
		//如果是相等
		try {
			if("==".equals(operator) || "=".equals(operator)){
				returnValue = value;
			}else if(operator.contains(">") ){
					returnValue = Integer.parseInt(String.valueOf(value))+1;
			}else if(operator.contains("<")){
					returnValue = Integer.parseInt(String.valueOf(value))-1;
			}else if(operator.contains("!")){
					returnValue = String.valueOf(value)+"1";
			}
		}catch(Exception e){
			e.printStackTrace();
			throw new Exception("转化错误:"+e.getMessage());
		}
		return returnValue;
	}
	
	/**
	 * Clob类型转String`
	 * @param baseValue
	 * @return
	 */
	public static String clob2string(Object baseValue) {
		String strBaseValue = null;
		if (baseValue instanceof Clob) {
			Clob c = (Clob) baseValue;
			if (c != null) {
				try {
					strBaseValue = c.getSubString(1, (int) c.length());
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return strBaseValue;
	}
	
	/**
	 * @dsecprition 获取某个json数组中，域field的值
	 * @author Wangzhen
	 * @since 2014年3月22日
	 * @param jsonArray
	 * @param field
	 * @return String
	 */
	public static String getFiledValueOfJSONArray(JSONArray jsonArray, String field) {
		String fieldValue = "";
		// 组装的JSON数组不为空
		if (null != jsonArray && jsonArray.size() > 0) {
			for (int i = 0; i < jsonArray.size(); i++) {
				JSONObject json = jsonArray.getJSONObject(i);
				String id = json.getString("id");
				// 如果查询到key 为 filed
				if (field.equalsIgnoreCase(id)) {
					fieldValue = json.getString("value");
					break;
				}
			}
		}
		return fieldValue;
	}
	
	/**
	 * 拼装IN串
	 * 
	 * @param list
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static String generateIns(List list) {
		String inPara = "";
		if (null!=list&&list.size() > 0) {
			StringBuffer strBufinPara = new StringBuffer();
			for (int i = 0; i < list.size(); i++) {
				strBufinPara.append("?,");
			}
			inPara = strBufinPara.substring(0, strBufinPara.length() - 1)
					.toString();
		}
		return inPara;
	}
	/**
	 * 依申请类受理环节文书模板[受理通知书，补交告知通知书，不予受理通知书]
	 * @param code
	 *  code = 1 受理
	 *  code = 2 补交
	 *  code = 3 不予受理
	 * @return
	 */
	public static String getAcceptPaper(String type,int code){
		if(code<10){
			return  type+"-00"+code;
		}else if(code>9&&code<100){
			return  type+"-0"+code;
		}else{
			return type+"-"+code;
		}
	}
	/**
	 * 根据事项编码，抽取目录编码
	 * @param itemCode
	 * @return
	 */
	public static String getFolderCode(String itemCode){
		if(StringUtils.isNotBlank(itemCode)){
			int length = itemCode.length()-2;
			return itemCode.substring(0, length);
		}
		return "";
	}
	/**
	 * 标准文书规则
	 * @param type
	 * @param orgCode
	 * @return
	 */
	public static String getPaperSn(String region,String orgCode,String type,String order){
		return region+"-"+orgCode+"-"+type+"-"+order;
	}
	/**  
	  * 根据主键key读取主键的值value  
	  * @param filePath 属性文件路径  
	  * @param key 键名  
	  */   
    public static String readPropertyValue(String filePath, String key) {   
        Properties props = new Properties();   
 	    String value = null; 
        try {  
            props = PropertiesLoaderUtils.loadAllProperties(filePath); 
            value = props.getProperty(key); 
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
     return value;
    } 
    /**
     * 获取HadoopNameNode
     * @param filePath
     * @param key
     * @return
     */
    public static String readHadoopNameNodePropertyValue() {   
        Properties props = new Properties();   
 	    String value = null; 
        try {  
            props = PropertiesLoaderUtils.loadAllProperties("constant.properties"); 
            value = props.getProperty("spring.hadoop.cluster.namenoderpcaddress"); 
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
     return value;
    } 
	/**
	 * 判断是否手机号码
	 * @param email
	 * @return
	 */
	public static boolean isPhoneNumberValid(String phoneNumber) {
		boolean isValid = false;
		String expression = "((^(13|15|18|17)[0-9]{9}$)|(^0[1,2]{1}\\d{1}-?\\d{8}$)|(^0[3-9] {1}\\d{2}-?\\d{7,8}$)|(^0[1,2]{1}\\d{1}-?\\d{8}-(\\d{1,4})$)|(^0[3-9]{1}\\d{2}-? \\d{7,8}-(\\d{1,4})$))";
		CharSequence inputStr = phoneNumber;
		Pattern pattern = Pattern.compile(expression);
		Matcher matcher = pattern.matcher(inputStr);
		if (matcher.matches()) {
			isValid = true;
		}
		return isValid;
	}

	/**
	 * 判断是否邮箱
	 * @param email
	 * @return
	 */
	public static boolean isEmail(String email) {
		String str = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";
		Pattern p = Pattern.compile(str);
		Matcher m = p.matcher(email);
		return m.matches();
	} 
	/**
     * 封装JDK自带的UUID, 通过Random数字生成, 中间无-分割
     * @return 不带-分割的32位字符串
     */
    public static String uuid() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    } 
    public static String strToParamSql(String value){
		String result="";
		String[] strs=value.split(",");
		for(String s:strs){
			s="\'"+s+"\'";
			result+=s+",";
		}
		int index=result.lastIndexOf(",");
		result =result.substring(0,index);
		return result;
	}
}
